#include "HttpServer.hpp"
#include "Protocol.hpp"
#include <iostream>
#include <memory>
using namespace yzc_server;
using namespace std;
// tcp 服务器，启动方式与udp server一样
//./tcpServer + local_port    //我们将本主机的所有ip与端口绑定

static void Usage(string proc)
{
    cout << "\nUsage:\n\t" << proc << " lock_port\n\n";
}

// 对请求的解析
// 1. 服务器与网页如何分离？ -> 通过readdFile读取请求的地址，再加上网页的根目录即可访问相应的html文件
// 2. 用户请求url 与 web ./根目录 如何连接？ -> 只要再请求的反序列化中，解析出首行的url后再让./+url即可
// 3. 如何给用户返回正确的资源类型？（比如txt 图片 音频 视频 html） -> 根据path的后缀即可
bool Get(const HttpRequest &req, HttResponse &resp)
{
    if (req.path == "./search")
    {
        // 建立管道，用于进程间通信
        // fork创建子进程 exec("./bin/python.py",test.py )
        // 父进程通过，将req.parm 通过管道写给某些后端语言,py,java,php等语言
    }
    // 不进行处理
    cout << "------------------------------- http start -------------------------------" << endl;
    cout << req.inbuffer << endl;
    LogMessage(DEBUG, "\nmethod:%s\nurl:%s\nhttpversion:%s\npath:%s\nsuffix:%s\nsize:%d byte\n", req.method.c_str(), req.url.data(), req.httpversion.data(), req.path.c_str(), req.suffix.c_str(), req.size);
    cout << "------------------------------- http end ---------------------------------" << endl;

    std::string respline;

    respline = "HTTP/1.1 200 OK\r\n";                  // 响应状态行
    std::string respheader = suffixToDesc(req.suffix); // 根据后缀形成报头，报头后面的类型表示该网页的类型

    // 如果需要重定向，可以通过设置3开头等待参数和Location+网址来对我们的网址进行重定向
    //  respline = "Http/1.1 307 Temporary Redirect\r\n"; // 响应状态行
    //  respheader += "Location: https://www.qq.com/\r\n";

    respheader += "Set-Cookie: juzizhentian\r\n"; // 响应的cookie设置

    std::string respback = "\r\n"; // 响应的换行

    // header = "Content-Type: text/html\r\n";
    //  给客服返回的主要代码
    //  std::string body = "<html lang=\"en\"><head><meta charset = \"UTF-8\"><title>for test</title><h1>hello YZC</h1></head><body><p>这里是Http协议学习的测试网址</body></html>";
    std::string body;
    body.resize(req.size);
    if (!Util::readFile(req.path, (char *)(body.c_str()), req.size))
    {
        Util::readFile(html_404, (char *)(body.c_str()), req.size); // 读取资源失败，给你404这个页面
    }

    if (req.size > 0)
    {
        respheader += "Content-Length: ";
        respheader += to_string(req.size + 1);
        respheader += "\r\n";
    }
    resp.outbuffer += respline;
    resp.outbuffer += respheader;
    resp.outbuffer += respback;
    cout << "------------------------------- resp start -------------------------------" << endl;
    cout << resp.outbuffer;
    cout << "正文的大小" << body.size() << endl;
    cout << "------------------------------- resp end ---------------------------------" << endl;

    resp.outbuffer += body;
    return true;
}

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        Usage(argv[0]);
        exit(USAGE_ERR);
    }

    // 调用服务器
    uint16_t serverport = atoi(argv[1]);
    unique_ptr<HttpServer> tsvr(new HttpServer(Get, serverport));
    tsvr->initServer();
    tsvr->run();
    return 0;
}